package com.ming.exception;

import com.ming.enums.ErrorCode;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 基础异常类
 *
 * @author ming
 * @version 1.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
public abstract class BaseException extends RuntimeException {

    /**
     * 错误码
     */
    private final ErrorCode errorCode;

    /**
     * 错误数据（可选，用于返回给前端的额外信息）
     */
    private Object data;

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     */
    protected BaseException(ErrorCode errorCode) {
        super(errorCode.getMessage());
        this.errorCode = errorCode;
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     */
    protected BaseException(ErrorCode errorCode, String message) {
        super(message);
        this.errorCode = errorCode;
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param cause     原因
     */
    protected BaseException(ErrorCode errorCode, Throwable cause) {
        super(errorCode.getMessage(), cause);
        this.errorCode = errorCode;
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     * @param cause     原因
     */
    protected BaseException(ErrorCode errorCode, String message, Throwable cause) {
        super(message, cause);
        this.errorCode = errorCode;
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     * @param data      错误数据
     */
    protected BaseException(ErrorCode errorCode, String message, Object data) {
        super(message);
        this.errorCode = errorCode;
        this.data = data;
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     * @param data      错误数据
     * @param cause     原因
     */
    protected BaseException(ErrorCode errorCode, String message, Object data, Throwable cause) {
        super(message, cause);
        this.errorCode = errorCode;
        this.data = data;
    }

    /**
     * 获取错误码
     */
    public int getCode() {
        return errorCode.getCode();
    }

    /**
     * 获取错误信息
     */
    @Override
    public String getMessage() {
        return super.getMessage();
    }

    /**
     * 判断是否为客户端错误
     */
    public boolean isClientError() {
        return errorCode.isClientError();
    }

    /**
     * 判断是否为服务器错误
     */
    public boolean isServerError() {
        return errorCode.isServerError();
    }

    /**
     * 判断是否为业务错误
     */
    public boolean isBusinessError() {
        return errorCode.isBusinessError();
    }
}